package practice_2025_9.practice_9_15;

import java.util.*;

class Solution {
    /**
     * 螺旋矩阵
     * @param matrix
     * @return
     */
    public List<Integer> spiralOrder(int[][] matrix) {
       // 按照顺时针螺旋顺序, 返回矩阵中的所有元素
       // 按题目要求模拟
       int m = matrix.length;
       int n = matrix[0].length;
       int rBegin = 0, rEnd = m - 1 - rBegin, cBegin = 0, cEnd = n - 1 -cBegin;
       System.out.println("cEnd " + cEnd);
       List<Integer> res = new ArrayList<>();
       while(rBegin <= rEnd && cBegin <= cEnd) {
            // →
            for(int i = cBegin; i <= cEnd; i++) {
                res.add(matrix[rBegin][i]);
            }
            if (rBegin == rEnd) {
                break;
            }
            // ↓
            for(int i = rBegin + 1; i <= rEnd; i++) {
                res.add(matrix[i][cEnd]);
            }
            if (cBegin == cEnd) {
                break;
            }
            // ←
            for(int i = cEnd - 1; i >= cBegin; i--) {
                res.add(matrix[rEnd][i]);
            }
            // ↑
            for(int i = rEnd - 1; i > rBegin; i--) {
                res.add(matrix[i][cBegin]);
            }
            rBegin++;
            rEnd = m - 1 - rBegin;
            cBegin++;
            cEnd = n - 1 - cBegin;
       }
       return res;
    }

    /**
     * 前 k 个高频单词
     * @param nums
     * @param k
     * @return
     */
    public int[] topKFrequent(int[] nums, int k) {
        // 找到出现频率前 k 高的元素
        Map<Integer, Integer> hash = new HashMap<>();
        for(int num: nums) {
            hash.put(num, hash.getOrDefault(num, 0) + 1);
        }
        PriorityQueue<Integer> queue = new PriorityQueue((v1, v2) -> {
            return hash.get(v2) - hash.get(v1);
        });
        for(int key: hash.keySet()) {
            queue.add(key);
        }
        int[] res = new int[k];
        int i = 0;
        while(k-- > 0) {
            res[i++] = queue.poll();
        }
        return res;
    }
}